#!/user/bin/env python
# -*- coding: utf-8 -*-
''' 
Author: Sjy
LastEditTime: 2024-08-27 14:27:30
Description: dock 配置管理界面

属性
    visible: bool, 是否默认显示
    name: str, 名称
    title: str, 标题
    desc: str, 描述
    dock: str, dock 位置

'''
"""config/sys/docks.json 示例
{
    "docks":[
        {
            "name":"toolbar",
            "desc":"替换菜单",
            "visible":true,
            "dock":"plugins.carvecloud.aircraft.dock"
        },
    ],
    "dockNestingEnabled":true,
    "noTitleBar":true
}
"""

__all__= []


import os
import gui.controls.globalvar as GL
import gui.controls.settings as ST
import gui.components.util_file as UFile
import gui.components.utils as utils
import gui.items.dock as dock

from PyQt5 import QtCore, QtGui, QtWidgets

global FILE_CONFIG_PLUGIN_ITEMS
FILE_CONFIG_PLUGIN_ITEMS = "config/plugins/docks.json"

global __PLUGIN_INS
__PLUGIN_INS = {}

def init() -> None:
    """初始化docks
    """
    __init_qt_settings()
    __init_docks()
    pass
def __init_qt_settings() -> None:
    """初始化qt配置项
    """
    py3d = GL.get_value("py3d")
    # docks 仅提供系统设置 不在提供dock列表
    cfgDock = ST.get_docks_data() or {}
    # setDockNestingEnabled方法允许在QMainWindow中创建嵌套的停靠窗口。当设置为True时，可以将一个停靠窗口嵌套到另一个停靠窗口中。这对于创建复杂的用户界面布局非常有用，可以在一个停靠窗口内部进一步组织和管理其他停靠窗口
    py3d.setDockNestingEnabled(cfgDock.get("dockNestingEnabled", True))
    py3d.setDockOptions(
        QtWidgets.QMainWindow.AllowNestedDocks| # 允许嵌套的停靠窗口。如果启用此选项，您可以将一个停靠窗口放置在另一个停靠窗口中。
        QtWidgets.QMainWindow.AllowTabbedDocks| # 允许标签式的停靠窗口。如果启用此选项，您可以将多个停靠窗口放置在一个选项卡中，以节省界面空间。
        QtWidgets.QMainWindow.AnimatedDocks| # 启用停靠窗口的动画效果。如果启用此选项，当停靠窗口改变位置或大小时，将会显示平滑的动画效果。
        QtWidgets.QMainWindow.GroupedDragging| # 启用分组拖拽。如果启用此选项，您可以同时拖动多个停靠窗口。
        QtWidgets.QMainWindow.VerticalTabs # 将选项卡垂直显示。如果启用此选项，选项卡将以垂直方向堆叠显示，而不是水平方向。
    )

    py3d.setCorner(QtCore.Qt.TopLeftCorner, QtCore.Qt.LeftDockWidgetArea)
    py3d.setCorner(QtCore.Qt.TopRightCorner, QtCore.Qt.RightDockWidgetArea)
    py3d.setCorner(QtCore.Qt.BottomLeftCorner, QtCore.Qt.LeftDockWidgetArea)
    py3d.setCorner(QtCore.Qt.BottomRightCorner, QtCore.Qt.RightDockWidgetArea)
    pass
def __init_docks()-> None:
    """初始化docks
    """
    mods = []
    # 构建 dock 实例
    for item in __init_dock_items():
        importPath = item.get("import")
        try:
            moduleClasses = utils.get_all_subclasses(__import__(importPath, fromlist=[""]), dock.Dock)
            for module in moduleClasses:
                key = get_key(importPath, module)
                mod = module()
                add_key_ins(key, mod)
                # 继承此类的模块都会存在on_init函数 需要在程序启动时调用
                mods.append(mod)
                # 装载
                mod.on_load()
        except Exception as e:
            print(e)
    # 初始化
    for mod in mods:
        mod.on_init()

def __init_dock_items() -> list:
    """初始化dock items
    """
    dockItems = []
    if os.path.exists(FILE_CONFIG_PLUGIN_ITEMS):
        dockItems = UFile.open_json(FILE_CONFIG_PLUGIN_ITEMS) or []
    return dockItems

def get_key(pos:str=None, module:dock.Dock=None) -> str:
    """获取实例key
    Args:
        name (str): 安装时生成的名字
        module (dock.Dock): 继承的类模块
    Returns:
        str: 返回组合的类名
    """
    return f"{pos}({module.__name__})"
def add_key_ins(name:str=None, dockIns:dock.Dock=None) -> None:
    """添加实例管理
    Args:
        name (str, optional): key索引. Defaults to None.
        pluginIns (dock.Dock, optional): 实例. Defaults to None.
    """
    global __PLUGIN_INS
    __PLUGIN_INS[name] = dockIns

##  ============窗体测试程序 ================================
if  __name__ == "__main__":        ##用于当前窗体测试
    pass
